package com.yu.easyexcel;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.yu.pojo.FillData;
import com.yu.pojo.Student;
import org.junit.Test;

import java.util.HashMap;

/**
 * @BelongsProject: intelligentcommunity
 * @BelongsPackage: com.yu
 * @Author: yanhongwei
 * @CreateTime: 2022-10-15  21:48
 * @Description: TODO
 * @Version: 1.0
 */
public class demo {

    //简单读    excel 数据
    @Test
    public void test01() {
        //获得一个工作簿对象    .xls
        //param1 文件路径
        //param2 文件中每行数据y要存储的实体类类型
        //param3 监听器   每读取一行数据 都会调用监听器的 invoke 方法 ，在invoke 方法中可以获取读取到的数据
        ExcelReaderBuilder excelReaderBuilder = EasyExcel.read("src/test/testFile\\测试easyexcel.xlsx", Student.class, new StudentReadListener());
        //获得一个工作表对象    sheet
        ExcelReaderSheetBuilder sheet = excelReaderBuilder.sheet();
        // 读取工作表中的内容,每读取一行数据 都会调用监听器的 invoke 方法 ，在invoke 方法中可以获取读取到的数据
        sheet.doRead();

    }

    @Test
    public void test02() {
        //准备模板
        String template = "src/test/testFile\\template1.xlsx";

        /**
         * 第一个参数为：填充的目标文件
         * 第二个参数为，实体类的数据类型
         * 将实体类（参数二）写进文件中（参数一）：
         **/
        ExcelWriterBuilder write = EasyExcel.write("src/test/testFile\\测试填充单一模板数据.xlsx", FillData.class);
        //写入时参考的模板
        write.withTemplate(template);
        //获得sheet：一页表格
        ExcelWriterSheetBuilder sheet = write.sheet();

        //准备实体类数据
        FillData fillData = new FillData();
        fillData.setName("zs");
        fillData.setAge(22);

        //准备map 数据
        HashMap<String, String> map = new HashMap<>();
        map.put("name", "ls");
        map.put("age", "21");


        //sheet.doFill(fillData);
        sheet.doFill(map);
    }
}
/**
 * @Description : 监听器放到专门的类中，本次测试就放在这个类下
 */
class StudentReadListener extends AnalysisEventListener<Student> {
    //每读取一行数据 会调用一次这个方法
    int i = 1;
    @Override
    public void invoke(Student student, AnalysisContext analysisContext) {
        //可以在这里将读取的数据传进数据库或返回到前端
        System.out.println(student + " " + i++);

//        D导入到数据库，用相应的方法
    }
    //全部读取完之后 会调用该方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("读取完毕" + i);
    }
}
